package com.utils.pay;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

import org.springframework.beans.factory.annotation.Autowired;

import com.mysql.jdbc.ResultSetRow;
import com.utils.dateUtil.DateUtil;
import com.wf.course.model.bill.Bill;
import com.wf.course.service.IBillService;
import com.wf.course.web.Constants;
 
 
/**
 *
 * @author 李欣桦
 * @date 2015-1-6下午5:13:34
 *
 * 对账接口
 */
public class DownloadBillTest {
	@Autowired
	private IBillService billService;
    /*注意：
     * 微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中，跟原支付单订单号一致， bill_type 为 REVOKED
     * 微信在次日 9 点启动生成前一天的对账单，建议商户 9 点半后再获取；
     * 对账单中涉及金额的字段单位为“元”。
     * 该接口对应的数据为服务号--->微信支付---->订单流水(退款订单的日期不是发起退订请求的日期，目前没测出是哪个日期)
     */
     /*第一行数据：
     * 当日所有订单 :
     * 交易时间, 公众账号ID, 商户号, 子商户号, 设备号, 微信订单号, 商户订单号, 用户标识,交易类型, 交易状态, 付款银行, 货币种类, 总金额, 现金券金额, 微信退款单号, 商户退
     * 款单号, 退款金额, 现金券退款金额, 退款类型, 退款状态, 商品名称, 商户数据包, 手续费,费率
     *
     * 当日成功支付的订单:
     * 交易时间, 公众账号ID, 商户号, 子商户号, 设备号, 微信订单号, 商户订单号, 用户标识,交易类型, 交易状态, 付款银行, 货币种类, 总金额, 现金券金额, 商品名称, 商户数据包,
     * 手续费, 费率
     *
     * 当日退款的订单:
     * 交易时间, 公众账号ID, 商户号, 子商户号, 设备号, 微信订单号, 商户订单号, 用户标识,交易类型, 交易状态, 付款银行, 货币种类, 总金额, 现金券金额, 退款申请时间, 退款成功
     * 时间, 微信退款单号, 商户退款单号, 退款金额, 现金券退款金额，退款类型，退款状态,商品名称, 商户数据包, 手续费, 费率
     *
     */
   
     /*
     * 第二行为数据记录，各参数以逗号分隔，参数前增加`符号，为标准键盘 1 左边键的字符，字段顺序与表头一致
     *
     */
   
     /*
     * 倒数第二行为订单统计标题，最后一行为统计数据，顺序：总交易单数，总交易额，总退款金额，总现金券退款金额，手续费总金额
     */
    public static void main(String[]args) throws Exception {
        SortedMap<Object,Object> parameters =new TreeMap<Object,Object>();
        parameters.put("appid",ConfigUtil.APPID); //公众账号ID
        parameters.put("mch_id",ConfigUtil.MCH_ID); //商户号
//     parameters.put("device_info", "");//微信支付分配的终端设备号，填写此字段，只下载该设备号 的对账单
        parameters.put("nonce_str",PayCommonUtil.CreateNoncestr()); //随机字符串
        parameters.put("bill_date","20170113");//下载对账单的日期，格式：20140603，日期不可为当天。
        //bill_type:ALL返回当日所有订单信息,默认值SUCCESS返回当日成功支付的订单。REFUND，返回当日退款订单
        parameters.put("bill_type","ALL");
        String sign =PayCommonUtil.createSign("utf-8", parameters);
        parameters.put("sign", sign);
        String reuqestXml =PayCommonUtil.getRequestXml(parameters);
        
        String result=CommonUtil.httpsRequest(ConfigUtil.DOWNLOAD_BILL_URL, "POST",reuqestXml);
        if(result.startsWith("<xml>")){//查询日期为当天时，错误信息提示日期无效
            System.out.println(result);
            System.out.println("无订单");
        }else {  
           String tradeMsg =  result.substring(result.indexOf("`"));
           String tradeInfo =  tradeMsg.substring(0,tradeMsg.indexOf("总"));
           String tradeTotalMsg =tradeMsg.substring(tradeMsg.indexOf("总"));
           String tradeTotalInfo =tradeTotalMsg.substring(tradeTotalMsg.indexOf("`"));
         
//           System.out.println(result);
//           System.out.println(tradeMsg);
           System.out.println(tradeInfo);
//           System.out.println(tradeTotalMsg);
//           System.out.println(tradeTotalInfo);
         //  writeStrToFile(result);
          List<Bill> billList =  fmtString(tradeInfo);
      //    billService.saveBill(billList);
          
       }
    }
    //字符串转list
    public static List<Bill> fmtString(String resultStr){
    	
    	List<Bill> list = new ArrayList<Bill>();
    	
    	if(!"".equals(resultStr) && resultStr!=""){
    		resultStr = resultStr.replace("`", "");
    		//n条记录
    		String[] bills= 	resultStr.split("0.60%");
    		//遍历，保存对账单
    		for(int i=0;i<bills.length;i++){
    		//	list.add(bills[i]);
    			String[] bstr = bills[i].split(",");
    				String[] bl = new String[bstr.length]  ;  
    				for(int k=0;k<bstr.length;k++){
        				bl[k] = bstr[k];
        				 Bill bill= new Bill();
        				 bill.setTradetime(bl[0]); //交易时间
        				 bill.setGhid(bl[1]);//公众号id
        				 bill.setMchid(bl[2]);//商户号
        				 bill.setSubmch(bl[3]);//子商户号
        				 bill.setDeviceid(bl[4]) ; //设备号
        				 bill.setWxorder(bl[5]) ; //微信订单号
        				 bill.setBzorder(bl[6]); //商户订单号
        				 bill.setOpenid(bl[7]) ; //用户标识
        				 bill.setTradetype(bl[8]) ; //交易类型
        				 bill.setTradestatus(bl[9]); //交易状态
        				 bill.setBank(bl[10]) ; //付款银行
        				 bill.setCurrency(bl[11]) ; //货币种类
        				 bill.setTotalmoney(bl[12]) ; //总金额
        				 bill.setRedpacketmoney(bl[13]) ; //代金券或立减优惠金额
        				 bill.setWxrefund(bl[14]) ; //微信退款单号
        				 bill.setBzrefund(bl[15]) ; //商户退款单号
        				 bill.setRefundmoney(bl[16]); //退款金额
        				 bill.setRedpacketrefund(bl[17]) ; //代金券或立减优惠退款金额
        				 bill.setRefundtype(bl[18]) ; //退款类型
        				 bill.setRefundstatus(bl[19]) ; //退款状态
        				 bill.setProductname(bl[20]) ; //商品名称
        				 bill.setBzdatapacket(bl[21]) ; //商户数据包
        				 bill.setFee(bl[22]) ; //手续费
        				 bill.setRate(bl[23]) ; //费率
        				 
        				 list.add(bill);
        			}
    			 
    			 
    			
    		}
    	 
    	}
    	return list;
    } 
   
}
